name: Check URLs from changed files

on:
  push:
  pull_request:

permissions:
  # needed for checkout code
  contents: read

# This allows a subsequently queued workflow run to interrupt/wait for previous runs
concurrency:
  group: '${{ github.workflow }} @ ${{ github.run_id }}'
  cancel-in-progress: false         # true = interrupt, false = wait

jobs:

# NOTE: tj-actions/changed-files.
# For push events you need to include fetch-depth: 0 | 2 depending on your use case.
#  0: retrieve all history for all branches and tags
#  1: retrieve only current commit (by default)
#  2: retrieve until the preceding commit
  get-changed-files:
    name: Get changed files
    runs-on: ubuntu-latest
    outputs:
      fetch-depth: ${{ steps.set-params.outputs.fetch-depth }}
      files:       ${{ steps.set-files.outputs.files }}
      files-len:   ${{ steps.set-files.outputs.files-len }}
      matrix:      ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - name: Determine workflow params
        id: set-params
        run: |
          echo "fetch_depth=0" >> $GITHUB_OUTPUT
          if [ "${{ github.event_name }}" == "pull_request" ]; then
            echo "fetch_depth=0" >> $GITHUB_OUTPUT
          fi
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: ${{ steps.set-params.outputs.fetch-depth }}
      - name: Get changed files
        id: changed-files
        uses: tj-actions/changed-files@v43.0.0
        with:
          separator: " "
          json: true
      - id: set-files
        run: |
          echo "${{ steps.changed-files.outputs.all_changed_files }}"  \
            | jq --raw-output '. | join(" ")'  \
            | sed -e 's/^/files=/'  \
            >> $GITHUB_OUTPUT
          echo "${{ steps.changed-files.outputs.all_changed_files }}"  \
            | jq --raw-output '. | length'  \
            | sed -e 's/^/files-len=/'  \
            >> $GITHUB_OUTPUT
      - id: set-matrix
        run: |
          echo "{\"file\":${{ steps.changed-files.outputs.all_changed_files }}}"  \
            | sed -e 's/^/matrix=/'  \
            >> $GITHUB_OUTPUT


  check-urls:
    name: Check @ ${{ matrix.file }}
    if: ${{ fromJSON(needs.get-changed-files.outputs.files-len) > 0 }}
    needs: [get-changed-files]
    runs-on: ubuntu-latest
    strategy:
      matrix: ${{ fromJSON(needs.get-changed-files.outputs.matrix) }}
      max-parallel: 10
      fail-fast: false
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: ${{ needs.get-changed-files.outputs.fetch-depth }}
      - name: Setup Ruby v2.6
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.6
      - name: Install awesome_bot
        run: |
          gem install awesome_bot
      - name: Set output
        id: set-output
        run: echo "FILENAME=$(echo ${{ matrix.file }} | grep -oE '[a-zA-Z0-9_-]+(\.yml|\.md)')" >> "$GITHUB_OUTPUT"
      - name: "Check URLs of file: ${{ matrix.file }}"
        run: |
          awesome_bot "${{ matrix.file }}" --allow-redirect --allow-dupe --allow-ssl || true;
      - uses: actions/upload-artifact@v4
        with:
          name: ${{ steps.set-output.outputs.FILENAME}}
          path: ${{ github.workspace }}/ab-results-*.json


  reporter:
    name: GitHub report
    needs: [get-changed-files, check-urls]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout  # for having the sources of the local action
        uses: actions/checkout@v4
        # download and unzip the ab-results-*.json generated by job-matrix: check-urls
      - uses: actions/download-artifact@v4
        with:
          name: ${{ steps.set-output.outputs.FILENAME}}
      - name: Generate Summary Report
        uses: ./.github/actions/awesomebot-gh-summary-action
        with:
          ab-root: ${{ github.workspace }}
          files: ${{ needs.get-changed-files.outputs.files }}
          separator: " "
          append-heading: ${{ true }}
